<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" >

  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/turbolinks/5.2.0/turbolinks.js" integrity="sha256-iM4Yzi/zLj/IshPWMC1IluRxTtRjMqjPGd97TZ9yYpU=" crossorigin="anonymous"></script>
  <link href="https://fonts.googleapis.com/css?family=Roboto+Mono" rel="stylesheet">
  <link href="https://fonts.googleapis.com/css?family=Cousine|Inconsolata" rel="stylesheet">
  <link rel="shortcut icon" type="image/png" href="/favicon.png">

  <link rel="stylesheet" href="/css/style.css">
  <link rel="stylesheet" href="/css/css/fontawesome-all.min.css">
  <link rel="stylesheet" href="/css/css/work-sans-v7.css">
  <script src="/js/main.js"></script>

  <!-- Begin Jekyll SEO tag v2.6.1 -->
<title>PY: Password Key Change | Hive Developer</title>
<meta name="generator" content="Jekyll v4.0.0" />
<meta property="og:title" content="PY: Password Key Change" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="How to change your accounts password and keys" />
<meta property="og:description" content="How to change your accounts password and keys" />
<link rel="canonical" href="password_key_change.html" />
<meta property="og:url" content="password_key_change.html" />
<meta property="og:site_name" content="Hive Developer" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2020-08-26T11:52:22-07:00" />
<script type="application/ld+json">
{"description":"How to change your accounts password and keys","mainEntityOfPage":{"@type":"WebPage","@id":"password_key_change.html"},"@type":"BlogPosting","url":"password_key_change.html","headline":"PY: Password Key Change","dateModified":"2020-08-26T11:52:22-07:00","datePublished":"2020-08-26T11:52:22-07:00","@context":"https://schema.org"}</script>
<!-- End Jekyll SEO tag -->


  
</head>
<body>
<header>
  <h1>
    <button type="button" class="open-nav" id="open-nav"></button>
    <a href="/"  class="logo-link"><img src="/images/logotype_black.svg" height="40" alt="Hive Developer logo"></a>
  </h1>

  
  <form action="/search/" method="get">
    <input type="text" name="q" id="search-input" placeholder="Search">
    <input type="submit" value="Search" style="display: none;">
  </form>
  

  <div id="sidebar" class="sidebar">
	
	
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/">
		<h6 class="ctrl-nav-section title">Introduction</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/#introduction-welcome">Welcome to Hive</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/quickstart/">
		<h6 class="ctrl-nav-section title">Quickstart</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/quickstart/#quickstart-choose-library">Choose Library</a></li>
						
					
						
						<li><a href="/quickstart/#quickstart-hive-full-nodes">Hive Nodes</a></li>
						
					
						
						<li><a href="/quickstart/#quickstart-testnet">Hive Testnet</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/tutorials/">
		<h6 class="ctrl-nav-section title">Tutorials</h6>
		<ul class="cont-nav-section content">
			
				
					
						<li><a href="/tutorials/#tutorials-javascript">Javascript</a></li>
					
				
					
						<li><a href="/tutorials/#tutorials-python">Python</a></li>
					
				
					
						<li><a href="/tutorials/#tutorials-ruby">Ruby</a></li>
					
				
					
						<li><a href="/tutorials/#tutorials-recipes">Recipes</a></li>
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/services/">
		<h6 class="ctrl-nav-section title">Services</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/services/#services-hive-blog">hive.blog</a></li>
						
					
						
						<li><a href="/services/#services-hivesigner">HiveSigner</a></li>
						
					
						
						<li><a href="/services/#services-jussi">Jussi</a></li>
						
					
						
						<li><a href="/services/#services-imagehoster">ImageHoster</a></li>
						
					
						
						<li><a href="/services/#services-dhf">DHF</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/apidefinitions/">
		<h6 class="ctrl-nav-section title">Appbase API</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/apidefinitions/#apidefinitions-condenser-api">Condenser Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-bridge">Bridge</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-account-by-key-api">Account By Key Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-account-history-api">Account History Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-block-api">Block Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-database-api">Database Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-debug-node-api">Debug Node Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-follow-api">Follow Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-jsonrpc">Jsonrpc</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-market-history-api">Market History Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-network-broadcast-api">Network Broadcast Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-rc-api">Rc Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-reputation-api">Reputation Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-rewards-api">Rewards Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-tags-api">Tags Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-transaction-status-api">Transaction Status Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-witness-api">Witness Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-broadcast-ops">Broadcast Ops</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-broadcast-ops-communities">Broadcast Ops Communities</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/resources/">
		<h6 class="ctrl-nav-section title">Resources</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/resources/#resources-overview">Overview</a></li>
						
					
						
						<li><a href="/resources/#resources-client-libs">Client Libraries</a></li>
						
					
						
						<li><a href="/resources/#resources-bluepaper">Bluepaper</a></li>
						
					
						
						<li><a href="/resources/#resources-whitepaper">Whitepaper</a></li>
						
					
						
						<li><a href="/resources/#resources-tools">Tools</a></li>
						
					
						
						<li><a href="/resources/#resources-hivesigner-libs">Hivesigner Libs</a></li>
						
					
						
						<li><a href="/resources/#resources-hive-keychain">Hive Keychain</a></li>
						
					
						
						<li><a href="/resources/#resources-developeradvocate">Community & Help</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/glossary/">
		<h6 class="ctrl-nav-section title">Glossary</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/glossary/#glossary-chain-basics">Chain Basics</a></li>
						
					
						
					
						
						<li><a href="/glossary/#glossary-governance">Governance</a></li>
						
					
						
						<li><a href="/glossary/#glossary-transactions">Transactions</a></li>
						
					
						
						<li><a href="/glossary/#glossary-api">API</a></li>
						
					
						
						<li><a href="/glossary/#glossary-market">Market</a></li>
						
					
				
			
		</ul>
	</section>
	
</div>



  <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
</header>
<div class="main" id="top">
  <div class="hero">
    <h1 class="hero__h1">Hive Developer Portal </h1>
    <img class="hero__img" src="/images/honey-comb-92.png" style="position: relative; top: 10px;" />
  </div>
  <section id="tutorials-python-password-key-change" class="row tutorials-python-password-key-change">
	<h3>
		<a id="tutorials-python-password-key-change">
			PY: Password Key Change
			
		</a>
	</h3>
	
		<span class="description"><p>How to change your accounts password and keys</p>
</span>
	

	<p><span class="fa-pull-left top-of-tutorial-repo-link"><span class="first-word">Full</span>, runnable src of <a href="https://gitlab.syncad.com/hive/devportal/-/tree/master/tutorials/python/tutorials/33_password_key_change">Password Key Change</a> can be downloaded as part of: <a href="https://gitlab.syncad.com/hive/devportal/-/tree/master/tutorials/python">tutorials/python</a>.</span>
<br /></p>

<p>In this tutorial we will explain and show you how to change your account password and keys on the <strong>Steem</strong> blockchain using the <code class="highlighter-rouge">steem</code> class found within the <a href="https://github.com/steemit/steem-python">steem-python</a> library.</p>

<h2 id="intro">Intro</h2>

<p>The Steem python library has a built-in function to update your account details on the blockchain. We are using the <code class="highlighter-rouge">AccountUpdate</code> and <code class="highlighter-rouge">commit.finalizeOp</code> to make these changes. The <code class="highlighter-rouge">AccountUpdate</code> function creates the operation that we will be committing to the blockchain using the <code class="highlighter-rouge">commit.finalizeOp</code> function. We first get the existing keys from your account then recreate these from your new password. Once these have been created using your new password we commit them to the blockchain. The initial parameters we need to complete this operation are:</p>

<ol>
  <li><em>account</em> - The user account that we will be changing</li>
  <li><em>old_password</em> - Your existing password for the account we are changing</li>
  <li><em>new_password</em> - The new password we will be updating your account with</li>
</ol>

<p><strong>Caution:</strong>
This functionality does not work on the TestNet so we will be modifying the <strong>live</strong> blockchain.</p>

<h2 id="steps">Steps</h2>

<ol>
  <li><a href="#setup"><strong>App setup</strong></a> - Library install and import. Connection to production</li>
  <li><a href="#input"><strong>User input</strong></a> - Input user and limit parameters</li>
  <li><a href="#connection"><strong>Connect to the blockchain</strong></a> - Connect to the blockchain using the parameters collected from the user</li>
  <li><a href="#configure"><strong>Configure new keys</strong></a> - Setup the new json object that will have the new keys derived from your new password</li>
  <li><a href="#commit"><strong>Commit changes to blockchain</strong></a> - Commit the account update to the blockchain</li>
</ol>

<h4 id="1-app-setup-">1. App setup <a name="setup"></a></h4>

<p>In this tutorial we use 2 package:</p>

<ul>
  <li><code class="highlighter-rouge">steem</code> - steem-python library and interaction with Blockchain</li>
  <li><code class="highlighter-rouge">steembase</code> - library containing functions to manipulate private keys and passwords as well as commit the operation to the blockchain</li>
</ul>

<p>We import the libraries and get parameters from the user.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">steem</span>
<span class="kn">import</span> <span class="nn">steembase</span>
<span class="kn">from</span> <span class="nn">steembase.account</span> <span class="kn">import</span> <span class="n">PasswordKey</span>
<span class="kn">from</span> <span class="nn">steembase.account</span> <span class="kn">import</span> <span class="n">PrivateKey</span>
<span class="kn">from</span> <span class="nn">steembase</span> <span class="kn">import</span> <span class="n">operations</span>
</code></pre></div></div>

<h3 id="2-user-input">2. User input<a name="input"></a></h3>

<p>You will first be asked for the account that we will be modifying the password for. You will then be prompted to enter your existing password as well as your new password that we will update your account with.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">account</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s">'Account: '</span><span class="p">)</span>
<span class="n">old_password</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s">'Current password: '</span><span class="p">)</span>
<span class="n">new_password</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s">'New password: '</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="3-connect-to-the-blockchain">3. Connect to the blockchain<a name="connection"></a></h3>

<p>From the parameters that have been collected we will generate the private key for the account and connect to the <strong>Steem</strong> blockchain.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">old_owner_key</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span>
    <span class="n">PasswordKey</span><span class="p">(</span><span class="n">account</span><span class="p">,</span> <span class="n">old_password</span><span class="p">,</span> <span class="s">"owner"</span><span class="p">)</span><span class="o">.</span><span class="n">get_private_key</span><span class="p">()</span>
<span class="p">)</span>

<span class="n">client</span> <span class="o">=</span> <span class="n">steem</span><span class="o">.</span><span class="n">Steem</span><span class="p">(</span><span class="n">keys</span><span class="o">=</span><span class="p">[</span><span class="n">old_owner_key</span><span class="p">])</span>
</code></pre></div></div>

<h3 id="4-configure-new-keys">4. Configure new keys<a name="configure"></a></h3>

<p>We will now generate new keys for each role using the new password as well as create the json that will be committed to the <strong>Steem</strong> blockchain. We generate new keys using the new password for each of these roles.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">new_public_keys</span> <span class="o">=</span> <span class="p">{}</span>

<span class="k">for</span> <span class="n">role</span> <span class="ow">in</span> <span class="p">[</span><span class="s">"owner"</span><span class="p">,</span> <span class="s">"active"</span><span class="p">,</span> <span class="s">"posting"</span><span class="p">,</span> <span class="s">"memo"</span><span class="p">]:</span>
    <span class="n">private_key</span> <span class="o">=</span> <span class="n">PasswordKey</span><span class="p">(</span><span class="n">account</span><span class="p">,</span> <span class="n">new_password</span><span class="p">,</span> <span class="n">role</span><span class="p">)</span><span class="o">.</span><span class="n">get_private_key</span><span class="p">()</span>
    <span class="n">new_public_keys</span><span class="p">[</span><span class="n">role</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">private_key</span><span class="o">.</span><span class="n">pubkey</span><span class="p">)</span>

<span class="n">new_data</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">"account"</span><span class="p">:</span> <span class="n">account</span><span class="p">,</span>
    <span class="s">"json_metadata"</span><span class="p">:</span> <span class="p">{},</span>
    <span class="s">"owner"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s">"key_auths"</span><span class="p">:</span> <span class="p">[</span>
            <span class="p">[</span><span class="n">new_public_keys</span><span class="p">[</span><span class="s">"owner"</span><span class="p">],</span> <span class="mi">1</span><span class="p">]</span>
        <span class="p">],</span>
        <span class="s">"account_auths"</span><span class="p">:</span> <span class="p">[],</span>
        <span class="s">"weight_threshold"</span><span class="p">:</span> <span class="mi">1</span>
    <span class="p">},</span>
    <span class="s">"active"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s">"key_auths"</span><span class="p">:</span> <span class="p">[</span>
            <span class="p">[</span><span class="n">new_public_keys</span><span class="p">[</span><span class="s">"active"</span><span class="p">],</span> <span class="mi">1</span><span class="p">]</span>
        <span class="p">],</span>
        <span class="s">"account_auths"</span><span class="p">:</span> <span class="p">[],</span>
        <span class="s">"weight_threshold"</span><span class="p">:</span> <span class="mi">1</span>
    <span class="p">},</span>
    <span class="s">"posting"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s">"key_auths"</span><span class="p">:</span> <span class="p">[</span>
            <span class="p">[</span><span class="n">new_public_keys</span><span class="p">[</span><span class="s">"posting"</span><span class="p">],</span> <span class="mi">1</span><span class="p">]</span>
        <span class="p">],</span>
        <span class="s">"account_auths"</span><span class="p">:</span> <span class="p">[],</span>
        <span class="s">"weight_threshold"</span><span class="p">:</span> <span class="mi">1</span>
    <span class="p">},</span>
    <span class="s">"memo_key"</span><span class="p">:</span> <span class="n">new_public_keys</span><span class="p">[</span><span class="s">"memo"</span><span class="p">]</span>
<span class="p">}</span>

<span class="k">print</span><span class="p">(</span><span class="s">"New data:"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">new_data</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="5-commit-changes-to-blockchain-">5. Commit changes to blockchain <a name="commit"></a></h4>

<p>The <code class="highlighter-rouge">operations.AccountUpdate(**new_data)</code> creates the operation that will be committed to the blockchain using the new json object we have created.</p>

<p>Once we commit the changes to the blockchain using <code class="highlighter-rouge">client.commit.finalizeOp</code> the changes are committed and the password is updated.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">op</span> <span class="o">=</span> <span class="n">operations</span><span class="o">.</span><span class="n">AccountUpdate</span><span class="p">(</span><span class="o">**</span><span class="n">new_data</span><span class="p">)</span>

<span class="n">result</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">commit</span><span class="o">.</span><span class="n">finalizeOp</span><span class="p">(</span><span class="n">op</span><span class="p">,</span> <span class="n">account</span><span class="p">,</span> <span class="s">"owner"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Result:"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</code></pre></div></div>

<p>If you update your password and attempt to update it again to quickly you will receive the following error.</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Assert Exception:_db.head_block_time() - account_auth.last_owner_update &gt; STEEM_OWNER_UPDATE_LIMIT: Owner authority can only be updated once an hour.
</code></pre></div></div>

<p>You will need to wait at least an hour before attempting this again.</p>

<p>That’s it!</p>

<h3 id="to-run-the-tutorial">To Run the tutorial</h3>

<ol>
  <li><a href="getting_started.html">review dev requirements</a></li>
  <li><code class="highlighter-rouge">git clone https://gitlab.syncad.com/hive/devportal.git</code></li>
  <li><code class="highlighter-rouge">cd devportal/tutorials/python/33_password_key_change</code></li>
  <li><code class="highlighter-rouge">pip install -r requirements.txt</code></li>
  <li><code class="highlighter-rouge">python index.py</code></li>
  <li>After a few moments, you should see a prompt for input in terminal screen.</li>
</ol>

<hr />

</section>

</div>
<div class="footer">
  <a href="#">Back to top</a>
</div>
<script>
    document.getElementById("open-nav").addEventListener("click", function () {
        document.body.classList.toggle("nav-open");
    });
</script>
</body>
</html>


<script src="/js/adjust.js"></script>

